package cn.js.sangu.unitStore.service.impl;

import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.js.sangu.unitStore.common.constant.SysInfo;
import cn.js.sangu.unitStore.common.exception.ServiceException;
import cn.js.sangu.unitStore.entity.MessageBox;
import cn.js.sangu.unitStore.mapper.MessageBoxMapper;
import cn.js.sangu.unitStore.service.MessageBoxService;
import lombok.extern.slf4j.Slf4j;

/**
 * 信箱服务实现类
 */
@Slf4j
@Service
public class MessageBoxServiceImpl extends ServiceImpl<MessageBoxMapper, MessageBox> implements MessageBoxService {

    @Override
    public MessageBox saveOfflineMessage(MessageBox messageBox) {
        if (messageBox == null) {
            throw new ServiceException("消息对象不能为空");
        }

        // 设置默认值
        if (messageBox.getCreatTime() == null) {
            messageBox.setCreatTime(new Date());
        }
        if (messageBox.getIsRead() == null) {
            messageBox.setIsRead(SysInfo.ReadingStatusUnconf);
        }

        boolean saved = this.save(messageBox);
        if (!saved) {
            throw new ServiceException("保存消息失败");
        }

        return messageBox;
    }

    @Override
    public List<MessageBox> getUnreadMessages(String userId) {
        if (userId == null || userId.isEmpty()) {
            return null;
        }

        return baseMapper.selectUnreadByUserId(userId);
    }

    @Override
    public boolean markAsRead(Long messageId) {
        if (messageId == null) {
            return false;
        }

        MessageBox messageBox = new MessageBox();
        messageBox.setId(messageId);
        messageBox.setIsRead(SysInfo.ReadingStatusIsConf);

        return this.updateById(messageBox);
    }

    @Override
    public int markAllAsRead(String userId) {
        if (userId == null || userId.isEmpty()) {
            return 0;
        }

        return baseMapper.updateAllReadByUserId(userId);
    }

    @Override
    public List<MessageBox> getAllMessages(String userId, int limit, int offset) {
        if (userId == null || userId.isEmpty()) {
            return null;
        }

        return baseMapper.selectAllByUserId(userId, limit, offset);
    }

    @Override
    public boolean removeByUserId(String userId) {
        if (userId == null || userId.isEmpty()) {
            return false;
        }

        try {
            // 使用QueryWrapper根据用户ID删除所有消息
            QueryWrapper<MessageBox> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("user_id", userId);
            return this.remove(queryWrapper);
        } catch (Exception e) {
            log.error("根据用户ID删除消息失败，用户ID: {}", userId, e);
            return false;
        }
    }
}